// 基本语法


// let a="hello";
// console.log(a.length)
// let b=[1,2,3]
// console.log(b.length)


// function logLength<T>(arg: T): void {
//     console.log(arg.length);
// }
interface Lengthwise {
    length: number;
}

function logLength<T extends Lengthwise>(arg: T): void {
    console.log(arg.length);
}

// 正确的使用
// logLength("hello"); // 输出: 5
// logLength(2134324)
// logLength([1, 2, 3, 4])
// logLength({length: 10});
// logLength(true);

// 错误的使用，因为数字没有 length 属性
// logLength(42); // 错误


// 在泛型约束中使用类型参数
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
    return obj[key];
}

let person = {name: "John", age: 30, address: "123 Main St"};
// 正确使用：key是obj的一个属性
console.log(getProperty(person, "name")); // 输出: John
console.log(getProperty(person, "age")); // 输出: 30


// 使用类类型约束
// function createInstance<T extends new () => {}>(ctor: T): InstanceType<T> {
//     return new ctor();
// }
function createInstance<T extends new () => any>(ctor: T): InstanceType<T> {
    return new ctor();
}

class Person {
    name: string = "Anonymous";

    greet(): void {
        console.log(`Hello, my name is ${this.name}`);
    }

}

abstract class Animal {
    abstract makeSound(): void;
}

class Dog {
    makeSound(): void {
        console.log("汪汪汪");
    }
}

// 创建类的实例
let person1 = createInstance(Person);
person1.greet(); // 输出: Hello, my name is Anonymous

// let aa = createInstance(Animal);
let bb = createInstance(Dog);
